using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using XLua;

/// <summary>
/// 管理lua的加载
/// 保证解析器的唯一性(单例实现)
/// </summary>
public class LuaMgr:BaseManager<LuaMgr>
{
    
    private LuaEnv luaEnv;


    /// <summary>
    /// 获取全局表，得到Lua中的_G
    /// </summary>
    public LuaTable Global
    {
        get
        {
            return luaEnv.Global;
        }
    }

    /// <summary>
    /// 初始化解析器
    /// </summary>
    public void Init()
    {
        if (luaEnv != null)
        {
            return;
        }
        luaEnv = new LuaEnv();
        

        // 重定向加载lua脚本
        luaEnv.AddLoader(MyCustomLoader);


        // 加载AB包中的lua脚本
        luaEnv.AddLoader(MyCustomABLoader);
    }

    /// <summary>
    /// 从自定义文件夹路径中重定向加载lua脚本
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    // 自动执行
    private byte[] MyCustomLoader(ref string filePath)
    {

        // 传入的参数是require执行的lua脚本文件名
        string path = Application.dataPath + "/Lua/" + filePath + ".lua";
        Debug.Log("加载lua脚本：" + path);
        
        if(File.Exists(path))
        {
            //使用File读取文件
            return File.ReadAllBytes(path);

        }
        else
        {
            Debug.LogError("重定向失败，文件名为：" + filePath);
            return null;
        }
    }


    /// <summary>
    /// 加载AB包中的lua脚本
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    private byte[] MyCustomABLoader(ref string filePath)
    {
        Debug.Log("加载AB包中的lua脚本：" + filePath);

        // 从AB包中加载Lua文件
        // 加载AB包
        string path = Application.streamingAssetsPath + "/lua" ;
        AssetBundle ab = AssetBundle.LoadFromFile(path);

        // 加载lua文件
        string luaPath = filePath + ".lua";
        TextAsset textAsset = ab.LoadAsset<TextAsset>(luaPath);

        // 将lua文件转换为byte数组
        byte[] bytes = textAsset.bytes;

        // 释放AB包
        ab.Unload(false);

        return bytes;
    }


    /// <summary>
    /// 传入lua文件名即可直接执行lua脚本
    /// </summary>
    /// <param name="fileName"></param>
    public void DoFile(string fileName)
    {
        string str = string.Format("require('{0}')", fileName);
        DoString(str);
    }

    /// <summary>
    /// 外部可调用执行的DoString
    /// </summary>
    /// <param name="str"></param>
    public void DoString(string str)
    {
        luaEnv.DoString(str);
    }

    public void Tick()
    {
        luaEnv.Tick();
    }

    public void Dispose()
    {
        luaEnv.Dispose();
    }
}
